package edu.uoc.vmerinom.tfc.report;

import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import net.sf.jooreports.templates.DocumentTemplateException;

import org.jboss.seam.ScopeType;
import org.jboss.seam.annotations.Name;
import org.jboss.seam.annotations.Scope;

import edu.uoc.vmerinom.tfc.domain.Componente;
import edu.uoc.vmerinom.tfc.domain.Grupo;
import edu.uoc.vmerinom.tfc.support.Message;
import edu.uoc.vmerinom.tfc.support.Utils;

/**
 * Clase que gestiona la generación de informes a través del servidor
 * LibreOffice para el módulo de componentes.
 * 
 * @author Víctor Manuel Merino Martínez
 * 
 */
@Name("componentesReport")
@Scope(ScopeType.CONVERSATION)
public class ComponentesReport extends Reports {

	/**
	 * Ruta y nombre de la plantilla.
	 */
	static final String RUTA_PLANTILLA_LISTADO = "/libreoffice/componentes.odt";
	/**
	 * Campo título grupo.
	 */
	static final String TITULO_NOMBRE_GRUPO = "tituloGrupo";
	/**
	 * Campo título componente.
	 */
	static final String TITULO_COMPONENTE = "tituloComponente";
	/**
	 * Campo título actividad.
	 */
	static final String TITULO_ACTIVIDAD = "tituloActividad";
	/**
	 * Campo título fecha de entrada.
	 */
	static final String TITULO_FECHA_ENTRADA = "tituloFecha";
	/**
	 * Campo nombre apellidos del componente.
	 */
	static final String NOMBRE_APELLIDOS = "nombre";
	/**
	 * Campo actividad del componente.
	 */
	static final String ACTIVIDAD = "actividad";
	/**
	 * Campo fecha de entrada.
	 */
	static final String ENTRADA = "entrada";
	/**
	 * Campo representante.
	 */
	static final String REPRESENTANTE = "representante";
	/**
	 * Campo nombre del grupo.
	 */
	static final String NOMBRE_GRUPO = "nombre";
	/**
	 * Campo número de componentes del grupo.
	 */
	static final String SIZE = "size";
	/**
	 * Lista de grupos.
	 */
	static final String GRUPOS = "grupos";
	/**
	 * Lista de componentes del grupo.
	 */
	static final String COMPONENTES = "componentes";

	/**
	 * Listado de grupos.
	 */
	List<Grupo> grupos;

	/**
	 * Genera un listado con los componentes activos del sistema.
	 * 
	 * @throws IOException
	 *             Excepciones de entrada/salida
	 * @throws DocumentTemplateException
	 *             Excepciones producidas en la generación del documento PDF
	 */
	public void listado() throws IOException, DocumentTemplateException {
		Map<String, Object> mapModel = new HashMap<String, Object>();
		SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy HH:mm:ss");
		Date date = new Date();
		mapModel.put(FECHA_HORA, sdf.format(date));
		mapModel.put(TITULO_REGISTRO, Message.get("report.members.list.title"));
		mapModel.put(TITULO_NOMBRE_GRUPO, Message.get("report.members.band.title"));
		mapModel.put(TITULO_COMPONENTE, Message.get("report.members.member.title"));
		mapModel.put(TITULO_ACTIVIDAD, Message.get("report.members.instrument.title"));
		mapModel.put(TITULO_FECHA_ENTRADA, Message.get("report.members.registration.date.title"));

		sdf = new SimpleDateFormat("dd/MM/yyyy");
		List<Map<String, Object>> listGrupos = new ArrayList<Map<String, Object>>();
		mapModel.put(GRUPOS, listGrupos);
		Map<String, Object> mapGrupo = null;
		for (Grupo grupo : grupos) {
			boolean tieneComponentesActivos = false;
			mapGrupo = new HashMap<String, Object>();
			List<Map<String, Object>> listComp = new ArrayList<Map<String, Object>>();
			mapGrupo.put(COMPONENTES, listComp);
			mapGrupo.put(NOMBRE_GRUPO, grupo.getNombre());

			if (grupo.getComponentes() != null) {
				for (Componente componente : grupo.getComponentes()) {
					if (componente.getBaja() == null || date.compareTo(componente.getBaja()) < 0) {
						tieneComponentesActivos = true;
						Map<String, Object> mapComp = new HashMap<String, Object>();
						mapComp.put(NOMBRE_APELLIDOS, Utils.getNombreApellidos(componente.getUsuario().getNombre(),
								componente.getUsuario().getPrimerApellido(), componente.getUsuario().getSegundoApellido()));
						mapComp.put(ACTIVIDAD, componente.getActividad());
						mapComp.put(ENTRADA, sdf.format(componente.getAlta()));
						mapComp.put(REPRESENTANTE, componente.isRepresentante());
						listComp.add(mapComp);
					}
				}
			}
			mapGrupo.put(SIZE, listComp.size());
			if (tieneComponentesActivos) {
				listGrupos.add(mapGrupo);
			}
		}

		write(mapModel, "RC", RUTA_PLANTILLA_LISTADO, date);
	}

	public List<Grupo> getGrupos() {
		return grupos;
	}

	public void setGrupos(List<Grupo> grupos) {
		this.grupos = grupos;
	}

}
